/** * Copyright 2015 GitFx * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package io.github.gitfx.dialog; import io.github.gitfx.GitFxApp; import io.github.gitfx.GitResourceBundle; import java.io.File; import java.io.PrintWriter; import java.io.StringWriter; import java.util.List; import java.util.Optional; import java.util.ResourceBundle; import javafx.animation.FadeTransition; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.collections.FXCollections; import javafx.geometry.Insets; import javafx.scene.control.Alert; import javafx.scene.control.Alert.AlertType; import javafx.scene.control.ButtonType; import javafx.scene.control.Dialog; import javafx.scene.control.Label; import javafx.scene.control.ListView; import javafx.scene.control.TextArea; import javafx.scene.control.TextField; import javafx.scene.layout.GridPane; import javafx.scene.layout.Priority; import javafx.stage.DirectoryChooser; import javafx.util.Duration; import javafx.util.Pair; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.jcabi.aspects.Loggable; /** * Concrete class which does GitDialog implementation * * @author rvvaidya */ @Loggable public class GitFxDialog implements GitDialog { private GitFxDialogResponse response; private String tempResponse; private ResourceBundle resourceBundle; private static final String EMPTY_STRING = ""; //[LOG] Logger logger = LoggerFactory.getLogger(GitFxApp.class.getName()); public GitFxDialog() { resourceBundle = new GitResourceBundle().getBundle(); } /* *Implementaiton of Generic Information dialog */ @Override public Dialog gitInformationDialog(String title, String header, String label) { Alert alert = new Alert(AlertType.INFORMATION); alert.setTitle(title); alert.setHeaderText(header); alert.setContentText(label); alert.showAndWait(); return alert; } /* *Implementaiton of Information List Dialog *A dialog box which returns the selected items once clicked on Ok */ @Override public String gitFxInformationListDialog(String title, String header, String label,List list){ Alert alert = new Alert(AlertType.INFORMATION); alert.setTitle(title); alert.setHeaderText(header); alert.setContentText(label); ListView<String> listView = new ListView<>(); listView.setItems(FXCollections.observableArrayList(list)); alert.getDialogPane().setContent(listView); alert.showAndWait(); //TODO Need to return the logged newValue for further JGit code to sync //a repository return null ; } /* *Implementation of Generic Error dialog */ @Override public void gitErrorDialog(String title, String error, String content) { Alert alert = new Alert(AlertType.ERROR); alert.setTitle(title); alert.setHeaderText(error); alert.setContentText(content); alert.showAndWait(); } /* * Implementation of Generic Warning Dialog */ @Override public void gitWarningDialog(String title, String header, String content) { Alert alert = new Alert(AlertType.WARNING); alert.setTitle(title); alert.setHeaderText(header); alert.setContentText(content); alert.showAndWait(); } /* * Implementation of Generic Exception Dialog */ @Override public void gitExceptionDialog(String title, String header, String content, Exception e) { Alert alert = new Alert(AlertType.ERROR); alert.setTitle(title); alert.setHeaderText(header); alert.setContentText(content); StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); e.printStackTrace(pw); String exceptionText = sw.toString(); Label label = new Label("Exception stack trace:"); TextArea textArea = new TextArea(exceptionText); textArea.setEditable(false); textArea.setWrapText(true); textArea.setMaxWidth(Double.MAX_VALUE); textArea.setMaxHeight(Double.MAX_VALUE); GridPane.setVgrow(textArea, Priority.ALWAYS); GridPane.setHgrow(textArea, Priority.ALWAYS); GridPane expContent = new GridPane(); expContent.setMaxWidth(Double.MAX_VALUE); expContent.add(label, 0, 0); expContent.add(textArea, 0, 1); alert.getDialogPane().setExpandableContent(expContent); alert.showAndWait(); } /* * Implementation of Git Open Dialog. */ @Override public String gitOpenDialog(String title, String header, String content) { String repo; DirectoryChooser chooser = new DirectoryChooser(); Dialog<Pair<String, GitFxDialogResponse>> dialog = new Dialog<>(); dialog.setTitle(title); dialog.setHeaderText(header); dialog.setContentText(content); ButtonType chooseButtonType = new ButtonType("Choose"); ButtonType okButton = new ButtonType("Ok"); ButtonType cancelButton = new ButtonType("Cancel"); dialog.getDialogPane().getButtonTypes().addAll(chooseButtonType, okButton, cancelButton); GridPane grid = new GridPane(); grid.setHgap(10); grid.setVgap(10); grid.setPadding(new Insets(20, 150, 10, 10)); TextField repository = new TextField(); repository.setPromptText("Repo"); grid.add(new Label("Repository:"), 0, 0); grid.add(repository, 1, 0); dialog.getDialogPane().setContent(grid); dialog.setResultConverter(dialogButton -> { if (dialogButton == chooseButtonType) { File path = chooser.showDialog(dialog.getOwner()); getFileAndSeText(repository,path); chooser.setTitle(resourceBundle.getString("repo")); } if (dialogButton == okButton) { String filePath = repository.getText(); //filePath = filePath.concat("/.git"); //[LOG] logger.debug(filePath); if (!filePath.isEmpty() && new File(filePath).exists()) { setResponse(GitFxDialogResponse.OK); return new Pair<>(repository.getText(), GitFxDialogResponse.OK); } else { this.gitErrorDialog(resourceBundle.getString("errorOpen"), resourceBundle.getString("errorOpenTitle"), resourceBundle.getString("errorOpenDesc")); } } if (dialogButton == cancelButton) { //[LOG] logger.debug("Cancel clicked"); setResponse(GitFxDialogResponse.CANCEL); return new Pair<>(null, GitFxDialogResponse.CANCEL); } return null; }); Optional<Pair<String, GitFxDialogResponse>> result = dialog.showAndWait(); result.ifPresent(repoPath -> { //[LOG] logger.debug(repoPath.getKey() + " " + repoPath.getValue().toString()); }); Pair<String, GitFxDialogResponse> temp = null; if (result.isPresent()) { temp = result.get(); } if(temp != null){ return temp.getKey();// + "/.git"; } return EMPTY_STRING; } /* * Implementation of Git Open Dialog. */ @Override public Pair<String, String> gitInitDialog(String title, String header, String content) { Pair<String, String> repo; Dialog<Pair<String, String>> dialog = new Dialog<>(); dialog.setTitle(title); dialog.setHeaderText(header); dialog.setContentText(content); GridPane grid = new GridPane(); grid.setHgap(10); grid.setVgap(10); grid.setPadding(new Insets(20, 150, 10, 10)); TextField localPath = new TextField(); localPath.setPromptText("Local Path"); grid.add(new Label("Local Path:"), 0, 0); grid.add(localPath, 1,0); ButtonType chooseButtonType = new ButtonType("Choose"); ButtonType initRepo = new ButtonType("Initialize Repository"); ButtonType cancelButtonType = new ButtonType("Cancel"); dialog.getDialogPane().setContent(grid); dialog.getDialogPane().getButtonTypes().addAll(chooseButtonType, initRepo, cancelButtonType); dialog.setResultConverter(dialogButton -> { if (dialogButton == chooseButtonType) { DirectoryChooser chooser = new DirectoryChooser(); chooser.setTitle(resourceBundle.getString("selectRepo")); File initialRepo = chooser.showDialog(dialog.getOwner()); getFileAndSeText(localPath, initialRepo); dialog.getDialogPane(); } if (dialogButton == initRepo) { setResponse(GitFxDialogResponse.INITIALIZE); String path = localPath.getText(); //[LOG] logger.debug( "path" + path + path.isEmpty()); if (new File(path).exists()) { //[LOG] logger.debug(path.substring(localPath.getText().lastIndexOf(File.separator))); String projectName= path.substring(localPath.getText().lastIndexOf(File.separator)+1); return new Pair<>(projectName, localPath.getText()); } else { this.gitErrorDialog(resourceBundle.getString("errorInit"), resourceBundle.getString("errorInitTitle"), resourceBundle.getString("errorInitDesc")); } } if (dialogButton == cancelButtonType) { setResponse(GitFxDialogResponse.CANCEL); return new Pair<>(null, null); } return null; }); Optional<Pair<String, String>> result = dialog.showAndWait(); Pair<String, String> temp = null; if (result.isPresent()) { temp = result.get(); } return temp; } @Override public Pair<String, String> gitCloneDialog(String title, String header, String content) { Dialog<Pair<String, String>> dialog = new Dialog<>(); DirectoryChooser chooser = new DirectoryChooser(); dialog.setTitle(title); dialog.setHeaderText(header); GridPane grid = new GridPane(); grid.setHgap(10); grid.setVgap(10); grid.setPadding(new Insets(20, 150, 10, 10)); TextField remoteRepo = new TextField(); remoteRepo.setPromptText("Remote Repo URL"); TextField localPath = new TextField(); localPath.setPromptText("Local Path"); grid.add(new Label("Remote Repo URL:"), 0, 0); grid.add(remoteRepo, 1, 0); grid.add(new Label("Local Path:"), 0, 1); grid.add(localPath, 1, 1); ButtonType chooseButtonType = new ButtonType("Choose"); ButtonType cloneButtonType = new ButtonType("Clone"); ButtonType cancelButtonType = new ButtonType("Cancel"); dialog.getDialogPane().setContent(grid); dialog.getDialogPane().getButtonTypes().addAll(chooseButtonType, cloneButtonType, cancelButtonType); dialog.setResultConverter(dialogButton -> { if (dialogButton == chooseButtonType) { //[LOG] logger.debug("Choose clicked"); chooser.setTitle(resourceBundle.getString("cloneRepo")); File cloneRepo = chooser.showDialog(dialog.getOwner()); getFileAndSeText(localPath, cloneRepo); } if (dialogButton == cloneButtonType) { setResponse(GitFxDialogResponse.CLONE); String remoteRepoURL = remoteRepo.getText(); String localRepoPath = localPath.getText(); if (!remoteRepoURL.isEmpty() && !localRepoPath.isEmpty()) { return new Pair<>(remoteRepo.getText(), localPath.getText()); } else { this.gitErrorDialog(resourceBundle.getString("errorClone"), resourceBundle.getString("errorCloneTitle"), resourceBundle.getString("errorCloneDesc")); } } if (dialogButton == cancelButtonType) { //[LOG] logger.debug("Cancel clicked"); setResponse(GitFxDialogResponse.CANCEL); return new Pair<>(null, null); } return null; }); Optional<Pair<String, String>> result = dialog.showAndWait(); Pair<String, String> temp = null; if (result.isPresent()) { temp = result.get(); } return temp; } public void getFileAndSeText(TextField localPath, File cloneRepo) { if(cloneRepo != null){ localPath.setText(cloneRepo.getPath()); setResponse(GitFxDialogResponse.CHOOSE); } } /* * Apply fade transition to dialog */ public void applyFadeTransition(Dialog node) { FadeTransition fadeTransition = new FadeTransition(); fadeTransition.setDuration(Duration.seconds(.5)); fadeTransition.setNode(node.getDialogPane()); fadeTransition.setFromValue(0); fadeTransition.setToValue(1); fadeTransition.play(); } public void gitConfirmationDialog(String title, String header, String content) { Alert alert = new Alert(AlertType.CONFIRMATION); alert.setTitle(title); alert.setHeaderText(header); alert.setContentText(content); Optional<ButtonType> result = alert.showAndWait(); if (result.get() == ButtonType.OK) { setResponse(GitFxDialogResponse.OK); } else { setResponse(GitFxDialogResponse.CANCEL); } } /** * * @return response */ @Override public GitFxDialogResponse getResponse() { return response; } public void setResponse(GitFxDialogResponse response) { this.response = response; } }